package com.课上案例练习.反射机制.获取构造方法;


import com.课上案例练习.反射机制.Bean.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 我们都知道构造方法的作用：初始化创建对象的，换句话说，只要创建对象就必须使用构造方法！！！
 * 我们这里不管获取部分构造还是所有构造其实意义都不大，因为我们创建对象，只需要一个构造即可，
 * 所以我们要学会如何获取单个构造!!!
 */
public class Test1 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

        demo3();

    }
    /**
     * 获取私有构造器
     * 通过暴力访问
     */
    private static void demo3() throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Class studentClass = Student.class;
        Constructor declaredConstructor = studentClass.getDeclaredConstructor(String.class, int.class);
        declaredConstructor.setAccessible(true);//暴力访问
        System.out.println(declaredConstructor.newInstance("张三", 18));
    }

    /**
     * 获取单个构造方法
     */
    private static void demo2() throws NoSuchMethodException {
        Class studentClass = Student.class;
        //获取无参构造
        Constructor declaredConstructor = studentClass.getDeclaredConstructor();
        //获取有参构造
        Constructor declaredConstructor1 = studentClass.getDeclaredConstructor(String.class);
        System.out.println(declaredConstructor);
        System.out.println(declaredConstructor1);
    }

    /**
     * 获取所有的构造方法
     */
    private static void demo1() {
        Class studentClass = Student.class;
        //获取所有构造方法
        Constructor[] constructors = studentClass.getConstructors();
        //遍历获取构造方法
        for (Constructor constructor : constructors) {
            System.out.println( constructor);
        }
    }
}
